Já foram realizados 2 testes: Sensor Pulsação - Teste #1 e Sensor Pulsação - Teste #2, ambos usando o QRD1114 (disponível em quantidade no Almoxarifado do curso). Nenhum deles geraram resultados promissores. Partindo então para outra abordagem usando outro sensor/circuito.
Neste caso, um novo teste é realizado usando o MRD500.
Diagrama elétrico
Baseado na solução proposta por Makezine: Infrared Pulse Sensor (acessado em 03/10/2024):

Noque os Amp.Op.s LM324 atuam como amplificadores e já contêm filtros passa-faixa para tratar o sinal de entrada capturado via led (diodo) foto-detector.
Já Instructables: DiY Arduino Pulse Sensor (acessado em 03/10/2024), propõe outro circuito:

Mas neste caso, o foto-detector nem está "polarizado".
Foi montada apenas a seção de entrada do circuito proposto por Makezine: Infrared Pulse Sensor, usando o MRD500 no lugar no led detector de IR e um led emissor de luz verde! (lembrar de Sensor de Pulso).
O Data sheet da Motorola (fabricante do MRD500) recomenda a seguinte ligação elétrica para seu foto-detector:

Note que o mesmo é usado de "modo reverso", isto é, a corrente que circula pelo circuito (modo reverso) é proporcional a intensidade luminosa recebida. É capaz de circular 1,2 Min (segundo informaçoes do Data Sheet). Este diodo suporta tensão reversa máxima de 100 Volts.
Segue pinagem do MRD500 (foto-diodo):

A curva de resposta deste diodo segue abaixo:

Nota-se que ele trabalha melhor com tensões reversas 10 Volts. Mas vamos aplicar 5 Volts. Isto resulta numa corrente reversa no intervalo [0,9 43] . Ou seja, se fosse usado o resistor de "carga" sugerido de 50 , teríamos uma tensão de saída oscilando na faixa de [0,000 045 0,00215] Volts. Razão pela qual temos que aumentar consideravelmente o valor deste resistor. Se fosse usado um resistor de 10 K obteremos uma resposta na faixa de [0,009 0,43] Volts. Aumentando este resistor para 1 M obteriámos uma tensão de saída na faixa de [0,9 43] Volts. Então percebemos que é melhor tentar com um resistor série de 100 K ( ), pode-se então esperar uma tensão variando na faixa de 90 mVolts até 4,3 Volts.
100 K (marrom, preto, amarelo, dourado).
Note também que a sensibilidade desde sensor varia conforme o comprimento de onda da luz incidente sobre o mesmo:

Note que o mesmo é mais sensível para a faixa de visível do vermelho indo para o infra-vermelho:

Mas vamos usar um led verde porque esta cor é melhor absorvida pela hemoglobina do sangue. Um led verde comum emite no comprimento de onda na faixa de [395 530] nm, que infelizmente não coincide com a melhor faixa de sensibilidade deste sensor.
Em função de componentes prontamente disponíveis no momento deste teste, foram usados 2 resistotes em série de 10 K, o que faria a tensão na saída do foto-diodo variar na faixa de 18 mV até 0,86 V. Considerando que a tensão de referência do A/D do Arduíno é de 5 Volts e que o mesmo é de 10-bits, significa valores excursionando na faixa de: 22 até 28.
Valores práticos obtidos
Na prática o valor médio medido ficou na faixa dos 25, o que equivale a uma tensão de 122 mV , com consequentemente uma corrente reversa circulando de 2,44 mA.
Modificando o código já usado em testes anteriores (ver Sensor Pulsação - Teste #1) para realizar uma captura de dados (teste) mas a uma taxa de amostragem aproximada de 5 Hz, ou 200 ms (variável TS = 200), foi obtido o seguinte gráfico:

Obs.: nos últimos 3 à 4 segundos da captura, o sensor está lendo dados com o dedo sendo retirado (a idéia era perceber como os valores variam neste caso).
Continuando...
Aparentemente estes resultados são promissores, mesmo usando resistor de carga do foto-detector com valor de 20 K ao invés dos 100 K previstos inicialmente. Mas o que mais falta realizar para determinar o "BPM"!?
É esperado medir pulsação na faixa de 30 à 330 BPM o que equivale a um sinal variando entre 0,5 à 5 Hz (apenas).
Se percebe pela captura de dados anterior (próximo do esperado relatado em Sensor de Pulso e Monitor de frequência de pulso) que o nível DC do sinal captado não nos interessa. Se faz necessário detectar uma oscilação sobreposta sobre outra e pode existir ainda uma terceira oscilação "de fundo" (frequência muito baixa) que deve ser descartada pois é causada por movimentação física do sensor/dedo. Como frequências acima de 5 Hz não são esperadas para a informação que queremos obter, então se faz necessário acrescentar um filtro passa-faixa com frequências de corte em 0,5 e 5 Hz.
Supondo que vamos trabalhar com uma taxa de amostragem superior a maior frequência esperada para o nosso sinal, significa trabalhar com Hz ou segundos.
Podemos projetar um filtro Butterworth digital usando o Matlab:
A função [a, b] = butter(ordem, [f_low, f_hight]) pede os seguintes argumentos:
[b a] = butter(1, [0,25 0,6],'stop');Então um filtro de 2a-ordem Butterworth passa-faixa para este caso, resultaria algo como:
>> fs=50; % freq. de amostragem>> f_Nyq=fs/2 % freq. de Nyquistf_Nyq = 25>> % 1.0 --- 25 Hz>> % f_low --- 0,5 Hz>> % f_high --- 5 Hz>> f_low=(0.5*1)/25f_low = 0.02>> f_high=5/25f_high = 0.2>> [b, a] = butter(2, [f_low, f_high])b = 0.056448 0 -0.1129 0 0.056448a = 1 -3.1595 3.7927 -2.0826 0.45045>> h = fvtool(b,a); % Visualizando filtor>> % Indicando na ferramenta "Filter Visualization Tool", a fs = 50 HzIndicando na ferramenta "Filter Visualization Tool", a 50 Hz, obtemos o seguinte gráfico:

A função transferência deste filtro ficaria:
xxxxxxxxxx>> T=1/fsT = 0.02>> H=tf(b, a, T);>> zpk(H) 0.056448 (z+1)^2 (z-1)^2 ----------------------------------------------- (z^2 - 1.914z + 0.9186) (z^2 - 1.245z + 0.4904) Sample time: 0.02 secondsDiscrete-time zero/pole/gain model.>> pole(H)ans = 0.95707 + 0.051172i 0.95707 - 0.051172i 0.62266 + 0.32039i 0.62266 - 0.32039i>> zero(H)ans = -1 + 1.1141e-08i -1 - 1.1141e-08i 1 + 0i 1 + 0iO diagrama de ROC (plano-z) deste filtro ficaria como:

A eq. de diferenças do flltro, no Matlab (respeitando a forma como variam os índices das matrizes no mesmo) fica:
Ou:
xxxxxxxxxx>> a'ans = 1 -3.1595 3.7927 -2.0826 0.45045>> b'ans = 0.056448 0 -0.1129 0 0.056448Então:
Note que não existem parâmetros para as amostras atrasadas e , eles são nulos.
A equação acima é a que dever ser implementada num código C++ no Arduíno.
Falta acrescentar detector de picos (usando derivada sobre o sinal filtrado) e determinação/cálculo dos períodos entre os picos para só então terminar determinando o BPM atual.
Parte 2 |
Fernando Passold, em 03/10/2024